package com.baymax.test.scene.drawable;

import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.StateListDrawable;
import android.util.StateSet;
import android.view.View;

import androidx.annotation.ColorInt;
import androidx.annotation.Px;

public class DrawableUtils {

    /**
     * 创建 StateListDrawable 。
     *
     * @param focusedDrawable 上焦状态时的 Drawable。
     * @return 能够响应状态的 StateListDrawable 。默认状态不展示。
     * @see android.R.attr#state_focused
     * @see View#isFocused()
     */
    public static StateListDrawable createStateDrawable(Drawable focusedDrawable) {
        return createStateDrawable(focusedDrawable, null);
    }

    /**
     * 创建 StateListDrawable 。
     *
     * @param focusedDrawable 上焦状态时的 Drawable。
     * @param normalDrawable  默认状态的 Drawable。
     * @return 能够响应状态的 StateListDrawable 。
     * @see android.R.attr#state_focused
     * @see View#isFocused()
     */
    public static StateListDrawable createStateDrawable(Drawable focusedDrawable, Drawable normalDrawable) {
        StateListDrawable drawable = new StateListDrawable();
        drawable.addState(new int[]{android.R.attr.state_focused}, focusedDrawable);
        drawable.addState(StateSet.WILD_CARD, normalDrawable);
        return drawable;
    }

    public static StateListDrawable createStateDrawable2(Drawable selectDrawable, Drawable normalDrawable) {
        StateListDrawable drawable = new StateListDrawable();
        drawable.addState(new int[]{android.R.attr.state_selected}, selectDrawable);
        drawable.addState(StateSet.WILD_CARD, normalDrawable);
        return drawable;
    }
    /**
     * 创建 StateListDrawable 。
     *
     * @param focusedDrawable  上焦状态时的 Drawable。
     * @param selectedDrawable 选中状态时的 Drawable。
     * @param normalDrawable   默认状态的 Drawable。
     * @return 能够响应状态的 StateListDrawable 。
     * @see android.R.attr#state_focused
     * @see android.R.attr#state_selected
     * @see View#isFocused()
     * @see View#isSelected()
     * @see View#setSelected(boolean)
     */
    public static StateListDrawable createStateDrawable(Drawable focusedDrawable, Drawable selectedDrawable, Drawable normalDrawable) {
        StateListDrawable drawable = new StateListDrawable();
        drawable.addState(new int[]{android.R.attr.state_focused}, focusedDrawable);
        drawable.addState(new int[]{android.R.attr.state_selected}, selectedDrawable);
        drawable.addState(StateSet.WILD_CARD, normalDrawable);
        return drawable;
    }

    /**
     * 创建具有从左向右渐变的圆角矩形 GradientDrawable 。
     *
     * @param color       颜色。
     * @param strokeColor 边框颜色
     * @param strokeWidth 边框宽度。
     * @param radius      圆角大小。
     * @return GradientDrawable 。
     */
    public static GradientDrawable createGradientDrawable(@ColorInt int[] color, @ColorInt int strokeColor, @Px int strokeWidth, @Px float radius) {
        GradientDrawable drawable = new GradientDrawable();
        drawable.setShape(GradientDrawable.RECTANGLE);
        drawable.setCornerRadius(radius);
        if (strokeWidth > 0 && Color.alpha(strokeColor) > 0) {
            drawable.setStroke(strokeWidth, strokeColor);
        }
        drawable.setOrientation(GradientDrawable.Orientation.LEFT_RIGHT);
        drawable.setColors(color);
        return drawable;
    }

    /**
     * 创建具有从上向下渐变的矩形 GradientDrawable 。
     *
     * @param color 颜色。
     * @return GradientDrawable 。
     */
    public static GradientDrawable createTop2BottomGradientDrawable(@ColorInt int[] color) {
        GradientDrawable drawable = new GradientDrawable();
        drawable.setShape(GradientDrawable.RECTANGLE);
        drawable.setOrientation(GradientDrawable.Orientation.TOP_BOTTOM);
        drawable.setColors(color);
        return drawable;
    }
    /**
     * 创建具有从左向右渐变的矩形 GradientDrawable 。
     *
     * @param color 颜色。
     * @return GradientDrawable 。
     */
    public static GradientDrawable createLeft2RightGradientDrawable(@ColorInt int[] color) {
        GradientDrawable drawable = new GradientDrawable();
        drawable.setShape(GradientDrawable.RECTANGLE);
        drawable.setOrientation(GradientDrawable.Orientation.LEFT_RIGHT);
        drawable.setColors(color);
        return drawable;
    }

    /**
     * 创建圆角矩形 GradientDrawable 。
     *
     * @param color  颜色。
     * @param radius 圆角大小。
     * @return GradientDrawable 。
     */
    public static GradientDrawable createGradientDrawable(@ColorInt int color, @Px float[] radius) {
        GradientDrawable drawable = new GradientDrawable();
        drawable.setShape(GradientDrawable.RECTANGLE);
        drawable.setCornerRadii(radius);
        drawable.setColor(color);
        return drawable;
    }

    /**
     * 创建圆角矩形 GradientDrawable 。
     *
     * @param color  颜色。
     * @param radius 圆角大小。
     * @return GradientDrawable 。
     */
    public static GradientDrawable createGradientDrawable(@ColorInt int color, @Px float radius) {
        return createGradientDrawable(color, 0, 0, radius);
    }

    /**
     * 创建带有边框的透明矩形 GradientDrawable 。
     *
     * @param strokeColor 边框颜色
     * @param strokeWidth 边框宽度。
     * @return GradientDrawable 。
     */
    public static GradientDrawable createGradientDrawable(@ColorInt int strokeColor, @Px int strokeWidth) {
        return createGradientDrawable(Color.TRANSPARENT, strokeColor, strokeWidth, 0);
    }

    /**
     * 创建具有边框和圆角的矩形 GradientDrawable 。
     *
     * @param color       颜色。
     * @param strokeColor 边框颜色
     * @param strokeWidth 边框宽度。
     * @return GradientDrawable 。
     */
    public static GradientDrawable createGradientDrawable(@ColorInt int color, @ColorInt int strokeColor, @Px int strokeWidth) {
        return createGradientDrawable(color, strokeColor, strokeWidth, 0);
    }

    /**
     * 创建具有边框和圆角的透明矩形 GradientDrawable 。
     *
     * @param strokeColor 边框颜色
     * @param strokeWidth 边框宽度。
     * @return GradientDrawable 。
     */
    public static GradientDrawable createGradientDrawable(@ColorInt int strokeColor, @Px int strokeWidth, @Px float radius) {
        return createGradientDrawable(Color.TRANSPARENT, strokeColor, strokeWidth, radius);
    }

    /**
     * 创建具有边框和顶部为自定义圆角的透明矩形 GradientDrawable 。
     *
     * @param strokeColor 边框颜色
     * @param strokeWidth 边框宽度。
     * @return GradientDrawable 。
     */
    public static GradientDrawable createGradientRoundDrawable(@ColorInt int strokeColor, @Px int strokeWidth, @Px float[] radius) {
        GradientDrawable drawable = new GradientDrawable();
        drawable.setShape(GradientDrawable.RECTANGLE);
        if (strokeWidth > 0 && Color.alpha(strokeColor) > 0) {
            drawable.setStroke(strokeWidth, strokeColor);
        }
        drawable.setCornerRadii(radius);
        drawable.setColor(Color.TRANSPARENT);
        return drawable;
    }

    /**
     * 创建具有边框和圆角的矩形 GradientDrawable 。
     *
     * @param color       颜色。
     * @param strokeColor 边框颜色
     * @param strokeWidth 边框宽度。
     * @param radius      圆角大小。
     * @return GradientDrawable 。
     */
    public static GradientDrawable createGradientDrawable(@ColorInt int color, @ColorInt int strokeColor, @Px int strokeWidth, @Px float radius) {
        GradientDrawable drawable = new GradientDrawable();
        drawable.setShape(GradientDrawable.RECTANGLE);
        if (strokeWidth > 0 && Color.alpha(strokeColor) > 0) {
            drawable.setStroke(strokeWidth, strokeColor);
        }
        drawable.setCornerRadius(radius);
        drawable.setColor(color);
        return drawable;
    }

    /**
     * 创建底部为圆角的矩形 GradientDrawable 。
     *
     * @param color  颜色。
     * @param radius 圆角大小。
     * @return GradientDrawable 。
     */
    public static GradientDrawable createBottomRoundGradientDrawable(@ColorInt int color, @Px float radius) {
        GradientDrawable drawable = new GradientDrawable();
        drawable.setShape(GradientDrawable.RECTANGLE);
        drawable.setCornerRadii(new float[]{0, 0, 0, 0, radius, radius, radius, radius});
        drawable.setColor(color);
        return drawable;
    }

    /**
     * 创建上部为圆角的矩形 GradientDrawable 。
     *
     * @param color  颜色。
     * @param radius 圆角大小。
     * @return GradientDrawable 。
     */
    public static GradientDrawable createTopRoundGradientDrawable(@ColorInt int color, @Px float radius) {
        GradientDrawable drawable = new GradientDrawable();
        drawable.setShape(GradientDrawable.RECTANGLE);
        drawable.setCornerRadii(new float[]{radius, radius, radius, radius, 0, 0, 0, 0});
        drawable.setColor(color);
        return drawable;
    }

    /**
     * 创建左侧为圆角的矩形 GradientDrawable 。
     *
     * @param color  颜色。
     * @param radius 圆角大小。
     * @return GradientDrawable 。
     */
    public static GradientDrawable createRightRoundGradientDrawable(@ColorInt int color, @Px float radius) {
        GradientDrawable drawable = new GradientDrawable();
        drawable.setShape(GradientDrawable.RECTANGLE);
        drawable.setCornerRadii(new float[]{0, 0, radius, radius, radius, radius, 0, 0});
        drawable.setColor(color);
        return drawable;
    }

    /**
     * 创建左侧为圆角的矩形 GradientDrawable 。
     *
     * @param color  颜色。
     * @param radius 圆角大小。
     * @return GradientDrawable 。
     */
    public static GradientDrawable createLeftRoundGradientDrawable(@ColorInt int color, @Px float radius) {
        GradientDrawable drawable = new GradientDrawable();
        drawable.setShape(GradientDrawable.RECTANGLE);
        drawable.setCornerRadii(new float[]{radius, radius, 0, 0, 0, 0, radius, radius});
        drawable.setColor(color);
        return drawable;
    }

    /**
     * 创建底部为圆角的具有从上向下渐变的矩形 GradientDrawable 。
     *
     * @param color  颜色。
     * @param radius 圆角大小。
     * @return GradientDrawable 。
     */
    public static GradientDrawable createBottomRoundGradientDrawable(@ColorInt int[] color, @Px float radius) {
        GradientDrawable drawable = new GradientDrawable();
        drawable.setShape(GradientDrawable.RECTANGLE);
        drawable.setOrientation(GradientDrawable.Orientation.TOP_BOTTOM);
        drawable.setCornerRadii(new float[]{0, 0, 0, 0, radius, radius, radius, radius});
        drawable.setColors(color);
        return drawable;
    }

    /**
     * 创建圆角的具有从左往右渐变的矩形 GradientDrawable 。
     *
     * @param color  颜色。
     * @param radius 圆角大小。
     * @return GradientDrawable 。
     */
    public static GradientDrawable createRoundGradientDrawable(@ColorInt int[] color, @Px float radius) {
        GradientDrawable drawable = new GradientDrawable();
        drawable.setShape(GradientDrawable.RECTANGLE);
        drawable.setOrientation(GradientDrawable.Orientation.BL_TR);
        drawable.setCornerRadius(radius);
        drawable.setColors(color);
        return drawable;
    }

    /**
     * 创建圆角的具有从左往右渐变的矩形 GradientDrawable 。
     *
     * @param color  颜色。
     * @param radius 圆角大小。
     * @return GradientDrawable 。
     */
    public static GradientDrawable createRoundGradientDrawable(@ColorInt int color, @Px float radius) {
        GradientDrawable drawable = new GradientDrawable();
        drawable.setShape(GradientDrawable.RECTANGLE);
        drawable.setCornerRadius(radius);
        drawable.setColor(color);
        return drawable;
    }

    /**
     * 创建圆形 GradientDrawable 。
     *
     * @param color 颜色。
     * @return GradientDrawable 。
     */
    public static GradientDrawable createOvalGradientDrawable(@ColorInt int color) {
        return createOvalGradientDrawable(color, 0, 0);
    }

    /**
     * 创建圆形 GradientDrawable 。
     *
     * @param color       颜色。
     * @param strokeColor 边框颜色。
     * @param strokeWidth 边框宽度。
     * @return GradientDrawable 。
     */
    public static GradientDrawable createOvalGradientDrawable(@ColorInt int color, @ColorInt int strokeColor, @Px int strokeWidth) {
        GradientDrawable drawable = new GradientDrawable();
        drawable.setShape(GradientDrawable.OVAL);
        drawable.setColor(color);
        if (strokeWidth > 0 && Color.alpha(strokeColor) > 0) {
            drawable.setStroke(strokeWidth, strokeColor);
        }
        return drawable;
    }

    /**
     * 创建圆形 GradientDrawable 。
     *
     * @param colors      渐变色(从左往右)。
     * @param strokeColor 边框颜色。
     * @param strokeWidth 边框宽度。
     * @return GradientDrawable 。
     */
    public static GradientDrawable createOvalGradientDrawable(@ColorInt int[] colors, @ColorInt int strokeColor, @Px int strokeWidth) {
        GradientDrawable drawable = new GradientDrawable();
        drawable.setShape(GradientDrawable.OVAL);
        drawable.setOrientation(GradientDrawable.Orientation.BL_TR);
        drawable.setColors(colors);
        if (strokeWidth > 0 && Color.alpha(strokeColor) > 0) {
            drawable.setStroke(strokeWidth, strokeColor);
        }
        return drawable;
    }

}
